package com.ipartek.desarrollo.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.ipartek.desarrollo.bean.Matriculas;
import com.ipartek.desarrollo.interfaces.IMatriculasDAO;
import com.ipartek.formacion.ddbb.AccessDAOFactory;

public class AccessMatriculasDAO implements IMatriculasDAO {

	private Connection conexion = null;
	private static PreparedStatement pst = null;
	private static ResultSet rs = null;
	private String sql;

	@Override
	public List<Matriculas> ListarMatriculas() {
		List<Matriculas> matriculas = new ArrayList<Matriculas>();
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
		Date fecha = null;
		try {
			fecha = formato.parse("2013-11-26");
		} catch (ParseException e) {
			e.printStackTrace();
		}

		sql = "SELECT "
				+ "PARTNERS.ENTIDAD AS entidad, "
				+ "MATRICULAS_ELEARNING.nombre AS nombre, "
				+ "MATRICULAS_ELEARNING.email AS email,"
				+ "MATRICULAS_ELEARNING.id_txn_pp, "
				+ "COMPRAS_PP.fecha_factura AS fecha_factura, "
				+ "COMPRAS_PP.num_factura AS num_factura,"
				+ "COMPRAS_PP.anio_factura AS anio_factura, "
				+ "COMPRAS_PP.item_number,"
				+ "COMPRAS_PP.payment_status AS payment_status, "
				+ "COMPRAS_PP.payment_date AS payment_date, "
				+ "CURSOS.TITULO AS titulo, "
				+ "CATEGORIAS.NOMBRECAT AS nombrecat, "
				+ "MATRICULAS_ELEARNING.cod_matricula AS cod_matricula,"
				+ "MATRICULAS_ELEARNING.nombre_usuario AS nombre_usuario, "
				+ "MATRICULAS_ELEARNING.contrasenia AS contrasenia, "
				+ "MATRICULAS_ELEARNING.fecha_notificacion AS fecha_notificacion, "
				+ "MATRICULAS_ELEARNING.fecha_inicio AS fecha_inicio, "
				+ "MATRICULAS_ELEARNING.fecha_fin AS fecha_fin, "
				+ "MATRICULAS_ELEARNING.baja AS baja "
				+ "FROM CATEGORIAS INNER JOIN "
				+ "((MATRICULAS_ELEARNING INNER JOIN "
				+ "(PARTNERS RIGHT JOIN COMPRAS_PP "
				+ "ON PARTNERS.CODIGO = COMPRAS_PP.custom) "
				+ "ON MATRICULAS_ELEARNING.id_txn_pp = COMPRAS_PP.txn_id) "
				+ "INNER JOIN Cursos "
				+ "ON COMPRAS_PP.item_number = Cursos.CURSO) "
				+ "ON CATEGORIAS.CODCATEGORIA = Cursos.CODCATEGORIA "
				+ "WHERE (payment_date>=?) ORDER BY payment_date DESC";

		// log.trace("Obtenemos el numero de matriculas de MatriculasElearning");
		// log.trace(sql);

		try {
			// Establecemos la conexion con la BD
			conexion = AccessDAOFactory.conectar();

			pst = conexion.prepareStatement(sql);
			pst.setString(1, formato.format(fecha));

			// Se ejecuta la query
			rs = pst.executeQuery();

			while (rs.next()) {
				Matriculas matricula = new Matriculas();
				matricula.setAnioFactura(rs.getString("anio_factura"));
				matricula.setCodMatricula(rs.getInt("cod_matricula"));
				matricula.setContrasenia(rs.getString("contrasenia"));
				matricula.setEmail(rs.getString("email"));
				matricula.setEntidad(rs.getString("entidad"));
				matricula.setBaja(rs.getString("baja"));
				matricula.setFechaFactura(rs.getDate("fecha_factura"));
				matricula.setFechaFIn(rs.getDate("fecha_fin"));
				matricula.setFechaInicio(rs.getDate("fecha_inicio"));
				matricula
						.setFechaNotificacion(rs.getDate("fecha_notificacion"));
				matricula.setNombre(rs.getString("nombre"));
				matricula.setNombreCat(rs.getString("nombrecat"));
				matricula.setNombreUsuario(rs.getString("nombre_usuario"));
				matricula.setNumFactura(rs.getString("num_factura"));
				matricula.setPaymentDate(rs.getDate("payment_date"));
				matricula.setPaymentStatus(rs.getString("payment_status"));
				matricula.setTitulo(rs.getString("titulo"));
				matriculas.add(matricula);
			}
			// log.trace("Hemos obtenido " + cuantos + " alumnos");
		} catch (SQLException e) {
			while (e != null) {
				// log.error("Message: " + e.getMessage() + "SQLState: "+
				// e.getSQLState() + "ErrorCode: " + e.getErrorCode());
				e = e.getNextException();
				e.printStackTrace();
			}
		} catch (Exception e) {
			// log.error("Exception general " + e.getMessage());
		} finally {
			// Se cierra la conexion con la BD
			AccessDAOFactory.desconectar(conexion);
		}
		return matriculas;
	}

	@Override
	public int NumeroMatriculas() {
		int cuantos = 0;

		sql = "SELECT count(*) as cuantos FROM Matriculas_Elearning";

		// log.trace("Obtenemos el numero de matriculas de MatriculasElearning");
		// log.trace(sql);

		try {
			// Establecemos la conexion con la BD
			conexion = AccessDAOFactory.conectar();

			pst = conexion.prepareStatement(sql);

			// Se ejecuta la query
			rs = pst.executeQuery();

			while (rs.next()) {
				// Pasamos los datos del resulset a la variable cuantos
				// Devolviendonos cuantos alumnos hay en la tabla
				cuantos = rs.getInt(1);
			}
			// log.trace("Hemos obtenido " + cuantos + " alumnos");
		} catch (SQLException e) {
			while (e != null) {
				// log.error("Message: " + e.getMessage() + "SQLState: "+
				// e.getSQLState() + "ErrorCode: " + e.getErrorCode());
				e = e.getNextException();
				e.printStackTrace();
			}
		} catch (Exception e) {
			// log.error("Exception general " + e.getMessage());
		} finally {
			// Se cierra la conexion con la BD
			AccessDAOFactory.desconectar(conexion);
		}
		return cuantos;
	}
}